package com.lqk.proxy.dynamic;

/**
 * @author lqk
 * @date 2021/12/7 20:01
 *
 * 动态代理模式的基本介绍
 *  1) 代理对象,不需要实现接口，但是目标对象要实现接口，否则不能用动态代理
 *  2) 代理对象的生成，是利用JDK的API，动态的在内存中构建代理对象
 *  3) 动态代理也叫做：JDK代理、接口代理
 *  JDK中生成代理对象的API
 *  1) 代理类所在包:java.lang.reflect.Proxy
 *  2) JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完
 * 整的写法是:
 *  static Object newProxyInstance(ClassLoader loader, Class<?>[]
 *  interfaces,InvocationHandler h )
 */
public class Client {
    public static void main(String[] args) {
        // 创建目标对象
        ITeacherDao target = new TeacherDao();
        // 给目标对象创建代理对象, 可以强转为 ITeacherDao
        ITeacherDao proxyInstance = (ITeacherDao) new ProxyFactory(target).getProxyInstance();
        // proxyInstance = class com.sun.proxy.$Proxy0 从此可以看出，内存中生成了代理对象
        System.out.println("proxyInstance = "+proxyInstance.getClass());
        // 通过代理对象调用目标对象的方法
        proxyInstance.teach();
        proxyInstance.sayHello("tom");
    }
}
